import datetime
import time
import sys
from ctypes import windll

#se necesita el archivo inpout32.dll
p = windll.inpout32
valCalibracion = 0

def calibrar(puertoIO, iteraciones,calibracion):
	i =0
	tinicio = float(0)
	tfin = float(0)
	pp = windll.inpout32
	listaNum = []
	tempVeces = 0
	moda= 0
	global valCalibracion
	#convertir a binario el numero de pin. empieza en el pin dos asi que el pin es el cero o que es lo mismo 2^0
	binarioSalida = pow(2,int(puertoIO[0])-2)
	binarioEntrada= pow(2,int(puertoIO[1]))
	pp.Out32(0x378,binarioSalida)
	print "Empezando calibracion. " + str(iteraciones) + " iteraciones."
	for i in range(int(iteraciones)):
		tinicio = float(time.clock())
		#ejecuta el ciclo hasta que el pin de entrada seleccionado cambie
		while  pp.Inp32(0x379) & binarioEntrada:
			pp.Out32(0x378,(pp.Inp32(0x378)-binarioSalida))
		tfin=float(time.clock())
		pp.Out32(0x378,binarioSalida)
		listaNum.append(tfin-tinicio)
	#calculando la moda (el valor que mas se repite)
	print "Todas las iteraciones han terminado, calculando la moda..."
	for n in listaNum:
		if listaNum.count(n) > tempVeces:
			tempVeces = listaNum.count(n)
			moda = n
	
	if calibracion == 1:
		valCalibracion = moda
	
	return moda

def cronometrar(puertoIO,iteraciones):	
	
	moda = calibrar(puertoIO,iteraciones,0)
	return abs(moda - valCalibracion)

	
#la funcion clock tiene mejor resolucion que time en windows, en linux es alreves
def dibujarPuerto():
	print "Puerto paralelo"
	print "_________________________________"
	print	 "\\13  12  11  10  9  8  7  6   5  4  3  2  1/"
	print " \\25 24 23 22 21 20 19 18 17 16 15 14/"
	print " \______________________________/"	

def leerDatos():
	pin = 0
	pinDic = {"10":"6","13":"4","12":"5","15":"3"}
	puertoIO=[0,0] 
	pin = raw_input("Escoja un pin de entrada (15,13,12,10): ")
	print
	puertoIO[0] = raw_input("Escoja un pin de salida (2-9): ")
	print
	iteraciones = raw_input("Numero de iteraciones: ")
	puertoIO[1] = pinDic[pin]
	return puertoIO, int(iteraciones)

def main(argv=None):
	if argv is None:
		argv = sys.argv
	
	
	print "CRONOMETRO POR PUERTO PARALELO"
	print
	print "Opciones:"
	print "1. Calibrar"
	print "2. Cronometrar"
	print "3. Salir"
	opcion = raw_input("Elija una opcion: ")
	opcion = int(opcion)
	
	if opcion == 1:
		
		print
		print "Conecte el pin de salida con el pin de entrada. "
		print 
		raw_input("Presione enter para continuar...")
		dibujarPuerto()
		puertos, iteraciones = leerDatos()
		moda = calibrar(puertos, iteraciones,1)
		print "El tiempo estimado para el cambio de estado del puerto es:  " + str(moda*1000000) + "us"

	elif opcion == 2:
		dibujarPuerto()
		puertos, iteraciones = leerDatos()
		tiempo = cronometrar(puertos,iteraciones)
		print "El tiempo estimado para la transmision y recepcion es:  " + str(tiempo*1000000) + "us"
		
	elif opcion == 3:
		sys.exit()
	
	main()
	
		
	
	
	
	
	
	
	

if __name__ == "__main__":
    sys.exit(main())






